﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TumbaloSoft.Models;
using System.Collections;
using TumbaloSoft.Helpers;
using TumbaloSoft.Helpers.QueryObjects;
using System.Net.Mail;
using System.Net;

namespace TumbaloSoft.Controllers
{
    public class HomeController : TumbaloController
    {
        private static Object lockObject = new Object();

        public ActionResult Index(BusquedaInmueble inmuebleBuscar)
        {
             
		   try
            {

			 //Obtener los datos de la persona logeada
			  if (AccountController.validarLogueo(HttpContext))
			  {
				  ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
				  PersonaNatural p = HelperPersonaNatural.selectById(ViewBag.idPersona);
				  ViewBag.nombrePersona = p.prNombre + " " + p.prApellidoPaterno;
				  ViewBag.permiso = AccountController.getIdPerfil(HttpContext);
				  ViewBag.logueado = true;
			  }
			  else { ViewBag.logueado = false; }
			  
			 //Fin de obtener datos
                IList listaDistritos = null;
                int numActivos = 0;
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();

                listaDistritos = HelperDistrito.selectAll();
                numActivos = HelperInmueble.selectCountActivos();
                if (inmuebleBuscar.prTipoInmueble == null)
                {
                    inmuebleBuscar.prTipoInmueble = new TipoInmueble();
                    inmuebleBuscar.prTipoInmueble.prIdTipoInmueble = 0;
                }
                ViewBag.ListaInmueble = HelperInmueble.buscar(inmuebleBuscar);

                ViewBag.prevPage = inmuebleBuscar.prPage - 1;
                ViewBag.nextPage = inmuebleBuscar.prPage + 1;
                ViewBag.numPages = numActivos / inmuebleBuscar.prPageSize;
                if ((numActivos % inmuebleBuscar.prPageSize) > 0) ViewBag.numPages++;

                ViewBag.listaDistritos = listaDistritos;

                return View(inmuebleBuscar);
           }
            catch(Exception ex) {
                Logger.Current.Error("Error al buscar el inmueble", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }

        //INMUEBLE

        public ActionResult Inmueble(BusquedaInmueble inmuebleBuscar)
        {
            try
            {
			  //Obtener los datos de la persona logeada
			  if (AccountController.validarLogueo(HttpContext))
			  {
				  ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
				  PersonaNatural p = HelperPersonaNatural.selectById(ViewBag.idPersona);
				  ViewBag.nombrePersona = p.prNombre + " " + p.prApellidoPaterno;
				  ViewBag.permiso = AccountController.getIdPerfil(HttpContext);
				  ViewBag.logueado = true;
			  }
			  else { ViewBag.logueado = false; }
                IList listaDistritos = null;
                int numActivos = 0;
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();

                listaDistritos = HelperDistrito.selectAll();
                numActivos = HelperInmueble.selectCountActivos();
                if (inmuebleBuscar.prTipoInmueble == null)
                {
                    inmuebleBuscar.prTipoInmueble = new TipoInmueble();
                    inmuebleBuscar.prTipoInmueble.prIdTipoInmueble = 0;
                }
                ViewBag.ListaInmueble = HelperInmueble.buscar(inmuebleBuscar);

                ViewBag.prevPage = inmuebleBuscar.prPage - 1;
                ViewBag.nextPage = inmuebleBuscar.prPage + 1;
                ViewBag.numPages = numActivos / inmuebleBuscar.prPageSize;
                if ((numActivos % inmuebleBuscar.prPageSize) > 0) ViewBag.numPages++;

                ViewBag.listaDistritos = listaDistritos;

                return View(inmuebleBuscar);
            }
            catch(Exception ex) {

                Logger.Current.Error("Error al buscar el inmueble", ex);
                return View("~/Views/Shared/Error.cshtml");
            
            }
        }

        public ActionResult Us()
        {
            try
            {
			  //Obtener los datos de la persona logeada
			  if (AccountController.validarLogueo(HttpContext))
			  {
				  ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
				  PersonaNatural p = HelperPersonaNatural.selectById(ViewBag.idPersona);
				  ViewBag.nombrePersona = p.prNombre + " " + p.prApellidoPaterno;
				  ViewBag.permiso = AccountController.getIdPerfil(HttpContext);
				  ViewBag.logueado = true;
			  }
			  else { ViewBag.logueado = false; }
                return View();
            }
            catch (Exception ex)
            {

                Logger.Current.Error("Error cargar la pagina", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }
        public ActionResult SuInmueble()
        {
            try
            {
			  //Obtener los datos de la persona logeada
			  if (AccountController.validarLogueo(HttpContext))
			  {
				  ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
				  PersonaNatural p = HelperPersonaNatural.selectById(ViewBag.idPersona);
				  ViewBag.nombrePersona = p.prNombre + " " + p.prApellidoPaterno;
				  ViewBag.permiso = AccountController.getIdPerfil(HttpContext);
				  ViewBag.logueado = true;
			  }
			  else { ViewBag.logueado = false; }
                return View();
            }
            catch
            {
                return View("~/Views/Shared/Error.cshtml");
            }
        }

        /* ---------------CONTÁCTENOS----------------*/
        public ActionResult Contactenos()
        {
            try
		  { //Obtener los datos de la persona logeada
			  if (AccountController.validarLogueo(HttpContext))
			  {
				  ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
				  PersonaNatural p = HelperPersonaNatural.selectById(ViewBag.idPersona);
				  ViewBag.nombrePersona = p.prNombre + " " + p.prApellidoPaterno;
				  ViewBag.permiso = AccountController.getIdPerfil(HttpContext);
				  ViewBag.logueado = true;
			  }
			  else { ViewBag.logueado = false; }
		  }
            catch(Exception ex)
            {
                Logger.Current.Error("Error en visualizar vista de solicitud de contacto ", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            return View();
        }

        [HttpPost]
        public ActionResult Contactenos(string tipoPersona, MyViewModel model)
        {
            try
            {
			  //Obtener los datos de la persona logeada
			  if (AccountController.validarLogueo(HttpContext))
			  {
				  ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
				  PersonaNatural p = HelperPersonaNatural.selectById(ViewBag.idPersona);
				  ViewBag.nombrePersona = p.prNombre + " " + p.prApellidoPaterno;
				  ViewBag.permiso = AccountController.getIdPerfil(HttpContext);
				  ViewBag.logueado = true;
			  }
			  else { ViewBag.logueado = false; }
                Consulta consulta = new Consulta();
                //consulta.prIdConsulta = (int)(HelperConsulta.SiguienteCodigo());
                consulta.prEstado = "PENDIENTE";
                consulta.prMensaje = model.Consulta.prMensaje;
                consulta.prFecha = DateTime.Today;
                string mensajeCorreo = "  se registró correctamente su soliticitud de contacto." +
                        "En breve lo responderemos. Muchas Gracias. ";

                if (tipoPersona == "N")
                {
                    PersonaNatural personaNatural = new PersonaNatural();
                    TipoDocumento ti = (TipoDocumento)HelperTipoDocumento.selectById(1);
                    personaNatural.prEstado = "ACTIVO";
                    personaNatural.prFechaNacimiento = DateTime.Today;
                    personaNatural.prIdTipoPersona = 3;
                    personaNatural.prTipoDocumento = ti;
                    personaNatural.prTelefono = model.Persona.prTelefono;
                    personaNatural.prEmail = model.Persona.prEmail;
                    personaNatural.prNombre = model.PersonaNatural.prNombre;

                    if (personaNatural.prEmail == null)
                    {
                        ModelState.AddModelError("Persona.prEmail", "Se requiere ingresar un Email de Contacto");
                        return View(model);
                    }
                    else if (ModelState.IsValidField("PersonaNatural.prNombre") && ModelState.IsValidField("Consulta.prMensaje"))
                    {
                        lock (lockObject)
                        {
                            consulta.prIdConsulta = (int)(HelperConsulta.SiguienteCodigo());
                            personaNatural.prIdPersona = (int)(HelperPersonaNatural.SiguienteCodigo());
                            consulta.prIdPersona = personaNatural.prIdPersona;
                            HelperPersonaNatural.insert(personaNatural);
                            HelperConsulta.insert(consulta);
                        }
                        SendEmail((string)(personaNatural.prEmail), "Confirmación de solicitud de contacto", "Estimado(a) Sr(a). " + personaNatural.prNombre + mensajeCorreo);
                        ViewBag.mensaje = "Se registro correctamente su consulta. Sr(a)  " + personaNatural.prNombre;
                        ViewBag.returnURL = "Contactenos";
                        return View("~/Views/Shared/Exito.cshtml");
                    }
                    else
                    {
                        return View(model);
                    }
                }
                else
                {

                    PersonaJuridica personaJuridica = new PersonaJuridica();
                    personaJuridica.prRazonSocial = model.PersonaNatural.prNombre;
                    personaJuridica.prTelefono = model.Persona.prTelefono;
                    personaJuridica.prIdTipoPersona = 3;
                    personaJuridica.prEstado = "ACTIVO";
                    personaJuridica.prEmail = model.Persona.prEmail;

                    if (personaJuridica.prEmail == null)
                    {
                        ModelState.AddModelError("Persona.prEmail", "Se requiere ingresar un Email de Contacto");
                        return View(model);
                    }

                    else if (ModelState.IsValidField("PersonaNatural.prNombre") && ModelState.IsValidField("Consulta.prMensaje"))
                    {
                        lock (lockObject)
                        {
                            consulta.prIdConsulta = (int)(HelperConsulta.SiguienteCodigo());
                            personaJuridica.prIdPersona = (int)(HelperPersonaJuridica.SiguienteCodigo());
                            consulta.prIdPersona = personaJuridica.prIdPersona;
                            HelperPersonaJuridica.insert(personaJuridica);
                            HelperConsulta.insert(consulta);
                        }
                        SendEmail((string)(personaJuridica.prEmail), "Confirmación Solicitud de Contacto", "Estimados Señores de  " + personaJuridica.prRazonSocial + mensajeCorreo);
                        ViewBag.mensaje = "Se registro correctamente su consulta. " + personaJuridica.prRazonSocial;
                        ViewBag.returnURL = "Contactenos";
                        return View("~/Views/Shared/Exito.cshtml");

                    }

                    else return View(model);

                }
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error aL registrar una solicitud de contacto ", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }
           
        } /*Fin de Contactenos*/




        //CATALOGO

        public ActionResult Catalogo(BusquedaInmueble inmuebleBuscar)
        {
            try
            {
			  //Obtener los datos de la persona logeada
			  if (AccountController.validarLogueo(HttpContext))
			  {
				  ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
				  PersonaNatural p = HelperPersonaNatural.selectById(ViewBag.idPersona);
				  ViewBag.nombrePersona = p.prNombre + " " + p.prApellidoPaterno;
				  ViewBag.permiso = AccountController.getIdPerfil(HttpContext);
				  ViewBag.logueado = true;
			  }
			  else { ViewBag.logueado = false; }
                IList listaDistritos = null;
                int numActivos = 0;
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                ViewBag.Monedas = HelperMoneda.selectAll();
                listaDistritos = HelperDistrito.selectAll();
                numActivos = HelperInmueble.selectCountActivosCatalogo();
                if (inmuebleBuscar.prTipoInmueble == null)
                {
                    inmuebleBuscar.prTipoInmueble = new TipoInmueble();
                    inmuebleBuscar.prTipoInmueble.prIdTipoInmueble = 0;
                }
                ViewBag.ListaInmueble = HelperInmueble.buscarCatalogo(inmuebleBuscar);

                ViewBag.prevPage = inmuebleBuscar.prPage - 1;
                ViewBag.nextPage = inmuebleBuscar.prPage + 1;
                ViewBag.numPages = numActivos / inmuebleBuscar.prPageSize;
                if ((numActivos % inmuebleBuscar.prPageSize) > 0) ViewBag.numPages++;

                ViewBag.listaDistritos = listaDistritos;
                return View(inmuebleBuscar);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error aL visualizar el catálogo", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }


        //INMUEBLE DETALLES:

        public ActionResult InmuebleDetalles(int? prIdInmueble)
        {
            try
            {
			  //Obtener los datos de la persona logeada
			  if (AccountController.validarLogueo(HttpContext))
			  {
				  ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
				  PersonaNatural p = HelperPersonaNatural.selectById(ViewBag.idPersona);
				  ViewBag.nombrePersona = p.prNombre + " " + p.prApellidoPaterno;
				  ViewBag.permiso = AccountController.getIdPerfil(HttpContext);
				  ViewBag.logueado = true;
			  }
			  else { ViewBag.logueado = false; }
                Inmueble inmueble = new Inmueble();
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                ViewBag.listaDistrito = HelperDistrito.selectAll();
                ViewBag.Monedas = HelperMoneda.selectAll();
                if (!prIdInmueble.HasValue)
                {
                    ViewBag.idPersona = prIdInmueble;
                }
                else
                {
                    inmueble = HelperInmueble.selectById(prIdInmueble.Value);
                    if (inmueble == null) return View();
                    else return View(inmueble);
                }
                return View(inmueble);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error aL visualizar los detalles del inmueble", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }

        [HttpPost]
        public ActionResult InmuebleDetalles(Inmueble im)
        {
            try
            {
			  //Obtener los datos de la persona logeada
			  if (AccountController.validarLogueo(HttpContext))
			  {
				  ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
				  PersonaNatural p = HelperPersonaNatural.selectById(ViewBag.idPersona);
				  ViewBag.nombrePersona = p.prNombre + " " + p.prApellidoPaterno;
				  ViewBag.permiso = AccountController.getIdPerfil(HttpContext);
				  ViewBag.logueado = true;
			  }
			  else { ViewBag.logueado = false; }
                ViewBag.Monedas = HelperMoneda.selectAll();
                return View();
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error aL visualizar los detalles del inmueble", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }

        //REGISTRAR CITA

        public ActionResult RegistrarCita(int? prIdInmueble,MyViewModel model)
        {
            if (!prIdInmueble.HasValue)
            {
                return View("~/Views/Shared/Error.cshtml");
            }
            else
            {
                try
                {
				 //Obtener los datos de la persona logeada
				 if (AccountController.validarLogueo(HttpContext))
				 {
					 ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
					 PersonaNatural p = HelperPersonaNatural.selectById(ViewBag.idPersona);
					 ViewBag.nombrePersona = p.prNombre + " " + p.prApellidoPaterno;
					 ViewBag.permiso = AccountController.getIdPerfil(HttpContext);
					 ViewBag.logueado = true;
				 }
				 else { ViewBag.logueado = false; }
                    ViewBag.listaDistrito = HelperDistrito.selectAll();
                    Inmueble inmueble = HelperInmueble.selectById(prIdInmueble.Value);
                    if (inmueble == null) return View();
                    else
                    {
                        model = new MyViewModel();
                        model.Inmueble = inmueble;
                    }
                    return View(model);
                }
                catch(Exception ex)
                {
                    Logger.Current.Error("Error aL registrar cita", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
            }
        }

        [HttpPost]
        public ActionResult RegistrarCita(MyViewModel model, int tipoPersona, int idDistrito, int hora, int? prIdInmueble, DateTime? prFecha)
        {
            if (!prIdInmueble.HasValue)
            {
                return View("~/Views/Shared/Error.cshtml");
            }
            else
            {
                try
                {
				 //Obtener los datos de la persona logeada
				 if (AccountController.validarLogueo(HttpContext))
				 {
					 ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
					 PersonaNatural p = HelperPersonaNatural.selectById(ViewBag.idPersona);
					 ViewBag.nombrePersona = p.prNombre + " " + p.prApellidoPaterno;
					 ViewBag.permiso = AccountController.getIdPerfil(HttpContext);
					 ViewBag.logueado = true;
				 }
				 else { ViewBag.logueado = false; }
                    ViewBag.listaVendedores = HelperVendedor.selectAll();
                    List<Vendedor> vendedores = new List<Vendedor>();
                    foreach (Vendedor vendedor in ViewBag.listaVendedores)
                    {
                        vendedores.Add(vendedor);
                    }
                    ViewBag.listaDistrito = HelperDistrito.selectAll();
                    if (model.Persona.prEmail == null)
                    {
                        ModelState.AddModelError("Persona.prEmail", "Se debe de ingresar un email");
                        return View(model);
                    }

                    if (prFecha == null)
                    {
                        ModelState.AddModelError("Cita.prFecha", "Se debe de seleccionar una fecha");
                        return View(model);
                    }

                    if (fechaCorrecta(prFecha.Value) == false)
                    {
                        ModelState.AddModelError("Cita.prFecha", "Se debe ingresar una fecha correcta");
                        return View(model);
                    }


                    Boolean sePuede = HelperCita.SePuedeRealizarCita(vendedores,prFecha.Value, hora, prIdInmueble.Value);
                    if (sePuede == false)
                    {
                        ModelState.AddModelError("Cita.prHora", "La cita ya esta programada escoga otra hora o fecha");
                        return View(model);
                    }

                    Cita cita = new Cita();
                    cita.prDistrito = new Distrito();
                    cita.prDistrito.prIdDistrito = idDistrito;
                    cita.prEstado = "PENDIENTE";
                    cita.prFecha = prFecha.Value;
                    cita.prInmueble = new Inmueble();
                    cita.prInmueble.prIdInmueble = prIdInmueble.Value;
                    cita.prMensaje = model.Cita.prMensaje;
                    cita.prHora = hora;
                    cita.prFechaFinal = DateTime.Today;
                    cita.prEmpleado = new Vendedor();
                    cita.prEmpleado.prIdVendedor = 1;
                    //cita.prIdCita = HelperCita.SiguienteCodigo();
                    if (tipoPersona == 1)
                    {
                        PersonaNatural personaNatural = new PersonaNatural();
                        TipoDocumento ti = (TipoDocumento)HelperTipoDocumento.selectById(1);
                        personaNatural.prEstado = "ACTIVO";
                        personaNatural.prFechaNacimiento = DateTime.Today;
                        personaNatural.prIdTipoPersona = 3;
                        personaNatural.prTipoDocumento = ti;
                        personaNatural.prTelefono = model.Persona.prTelefono;
                        personaNatural.prEmail = model.Persona.prEmail;
                        personaNatural.prNombre = model.PersonaNatural.prNombre;

                        if (ModelState.IsValidField("prRazonSocial"))
                        {
                            lock (lockObject)
                            {
                                cita.prIdCita = HelperCita.SiguienteCodigo();
                                personaNatural.prIdPersona = (int)(HelperPersonaNatural.SiguienteCodigo());
                                cita.prIdCliente = personaNatural.prIdPersona;
                                HelperPersonaNatural.insert(personaNatural);
                                HelperCita.insert(cita);
                            }
                            ViewBag.mensaje = "Se registro correctamente su cita";
                            ViewBag.returnURL = "../Home";
                            return View("~/Views/Shared/Exito.cshtml");
                        }
                        else
                        {
                            return View(model);
                        }
                    }
                    else
                    {
                        PersonaJuridica personaJuridica = new PersonaJuridica();
                        personaJuridica.prRazonSocial = model.PersonaNatural.prNombre;
                        personaJuridica.prTelefono = model.Persona.prTelefono;
                        personaJuridica.prIdTipoPersona = 3;
                        personaJuridica.prEstado = "ACTIVO";
                        personaJuridica.prEmail = model.Persona.prEmail;

                        if (ModelState.IsValidField("prRazonSocial"))
                        {
                            lock (lockObject)
                            {
                                cita.prIdCita = HelperCita.SiguienteCodigo();
                                personaJuridica.prIdPersona = (int)(HelperPersonaJuridica.SiguienteCodigo());
                                cita.prIdCliente = personaJuridica.prIdPersona;
                                HelperPersonaJuridica.insert(personaJuridica);
                                HelperCita.insert(cita);
                            }
                            ViewBag.mensaje = "Se registro correctamente su cita";
                            ViewBag.returnURL = "../Home";
                            return View("~/Views/Shared/Exito.cshtml");
                        }
                    }
                }
                catch(Exception ex)
                {
                    Logger.Current.Error("Error registrar cita", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
            }
            return View();
        }

        public Boolean fechaCorrecta(DateTime fecha)
        {
            try
            {
                if (new DateTime(fecha.Year, fecha.Month, fecha.Day) > DateTime.Today) return true;
                else return false;
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error en la fecha Correcta", ex);
                return false;
            }
            
        }


        public void SendEmail(string address, string subject, string message)
        {
            try
            {
                string email = "tumbalocorp@gmail.com";
                string password = "tumbalo123";

                var loginInfo = new NetworkCredential(email, password);
                var msg = new MailMessage();
                var smtpClient = new SmtpClient("smtp.gmail.com", 587);

                msg.From = new MailAddress(email);
                msg.To.Add(new MailAddress(address));
                msg.Subject = subject;
                msg.Body = message;
                msg.IsBodyHtml = true;

                smtpClient.EnableSsl = true;
                smtpClient.UseDefaultCredentials = false;
                smtpClient.Credentials = loginInfo;
                smtpClient.Send(msg);
            }
            catch(Exception ex) {
                Logger.Current.Error("Error al enviar email", ex);
                RedirectToAction("~/Views/Shared/Error.cshtml"); 
            }
        }
    }
}